package com.itaming.lycheeframework.support.lambda.predicate;


import java.util.Objects;
import java.util.function.DoublePredicate;
import java.util.function.IntPredicate;
import java.util.function.LongPredicate;
import java.util.function.Predicate;

/**
 * {@code byte} 值判断函数接口
 * <p>
 * 这是一个与 {@link Predicate} 类似的函数式接口，用于处理原始类型 {@code byte}，避免装箱开销
 * <p>
 * 因 {@code JDK} 中只提供了 {@link DoublePredicate}、{@link IntPredicate}
 * 和 {@link LongPredicate} 三种原始类型的判断函数，所以这里做了一个补充
 *
 * @author A.Ming
 */
@FunctionalInterface
public interface BytePredicate {

    /**
     * 对给定的值进行判断
     *
     * @param value 要判断的值
     * @return 如果值满足判断条件，则返回 {@code true}，否则返回 {@code false}
     */
    boolean test(byte value);

    /**
     * 返回组合后的判断函数，表示当前判断函数与另一个判断函数的短路与(AND)运算
     * <p>
     * 当前判断函数为 {@code false} 时，另一个判断函数不会被执行
     *
     * @param other 另一个判断函数
     * @return 表示当前判断函数与另一个判断函数的短路与(AND)运算的新判断函数
     * @throws NullPointerException {@code other} 为 null 时抛出
     */
    default BytePredicate and(BytePredicate other) {
        Objects.requireNonNull(other);
        return (value) -> test(value) && other.test(value);
    }

    /**
     * 返回当前判断函数的逻辑非(NOT)判断函数
     *
     * @return 表示当前判断函数的逻辑非(NOT)运算的新判断函数
     */
    default BytePredicate negate() {
        return (value) -> !test(value);
    }

    /**
     * 返回组合后的判断函数，表示当前判断函数与另一个判断函数的短路或(OR)运算
     * <p>
     * 当前判断函数为 {@code true} 时，另一个判断函数不会被执行
     *
     * @param other 另一个判断函数
     * @return 表示当前判断函数与另一个判断函数的短路或(OR)运算的新判断函数
     * @throws NullPointerException {@code other} 为 null 时抛出
     */
    default BytePredicate or(BytePredicate other) {
        Objects.requireNonNull(other);
        return (value) -> test(value) || other.test(value);
    }

}
